/** 
 *  Copyright 2010 Matthew Werny & Burk Price.
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *  under the License.
 */
package net.iceflow.db.migration.executer;

import net.iceflow.db.migration.exception.MigrationException;
import net.iceflow.db.jdbc.DatabaseType;
import net.iceflow.db.jdbc.ScriptRunner;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.Validate;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;

public class SQLScriptMigrationExecuter extends AbstractMigrationExecuter {

	private final Resource script;

	public SQLScriptMigrationExecuter(String version, Resource script) {
		super(version, script.getFilename());
		this.script = script;
	}

	public void migrate(DatabaseType dbType, Connection connection) {
		InputStream inputStream = null;

		try {
			inputStream = script.getInputStream();
			ScriptRunner scriptRunner = new ScriptRunner(dbType);
			scriptRunner.execute(connection, new InputStreamReader(inputStream, "UTF-8"));
			Validate.isTrue(!connection.isClosed(), "JDBC Connection should not be closed.");
		} catch (IOException e) {
			throw new MigrationException("Error while reading script input stream.", e);
		} catch (SQLException e) {
			throw new MigrationException("Error while executing migration script.", e);
		} finally {
			IOUtils.closeQuietly(inputStream);
		}
	}
}
